package com.lrabbit.mybatisplus.generator;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.lrabbit.mybatisplus.generator.bean.GenConfig;
import com.lrabbit.mybatisplus.generator.config.DefaultConfig;

import java.util.Scanner;

/**
 * 代码生成器
 * 生成: mapper.xml.service.serviceImpl.controller.API层(新模块)
 */
public class ApiGeneratorMybatisPlus {
    public static void main(String[] args) {

        // 【设置1】数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setDriverName("org.postgresql.Driver");
        dsc.setUrl("jdbc:postgresql://localhost:5432/postgres");
        dsc.setUsername("postgres");
        dsc.setPassword("6965433.");
        dsc.setDbType(DbType.POSTGRE_SQL);

        // [个性化配置]
        GenConfig genConfig = new GenConfig();
        // boot输出目录 \generator
        genConfig.setOutPutBootDir("\\rabbit-manager\\src\\main\\java");
        // api输出目录
        genConfig.setOutPutApiDir("\\rabbit-service-api\\src\\main\\java");

        /******************** 生成需要确认以下配置 ********************/
        // 去掉表的前缀生成类型
        genConfig.setTablePrefix("tb_");
        // 生成模块路径，一般修改最后一个名称，如：user模块
        genConfig.setPackageParentName("com.lrabbit.rabbit.user");
        // 生成的表
        genConfig.setInclude("tb_sys_user");

        System.out.println("/**** 开始自动生成代码（包含API模块）****/");
        System.out.println("确认执行请输入yes: （输入后按回车）");
        Scanner sc = new Scanner(System.in);
        String inputStr = sc.next();
        if (inputStr.equalsIgnoreCase("yes")) {
            DefaultConfig.execute(dsc, genConfig, true);
        } else {
            System.out.println("防止误操作，已退出");
        }

//        /******************** 创建代码生成器对象 ********************/
//        AutoGenerator mpg = new AutoGenerator();
//
//        /******************** 全局配置 ********************/
//        GlobalConfig gc = new GlobalConfig(); // 创建全局配置对象，用于后续设置生成代码的相关配置
//        String projectPath = System.getProperty("user.dir"); // 获取当前项目的根目录路径
//        // 设置生成代码的输出目录为当前项目根目录下的rabbit-api模块的源代码目录
//        gc.setOutputDir(projectPath + "/rabbit-api/src/main/java");
//        gc.setAuthor("common-generator");
//        gc.setOpen(false); // 设置是否打开生成的代码文件，这里设置为不打开
//        gc.setFileOverride(true);  // 允许覆盖已存在的文件，这里设置为允许覆盖
//        gc.setIdType(IdType.AUTO); // 设置主键生成策略为自动选择
//        gc.setDateType(DateType.ONLY_DATE); // 设置日期类型为只包含日期，不包含时间
//        gc.setSwagger2(true);
//        mpg.setGlobalConfig(gc);
//
//        /******************** 数据源配置 ********************/
//        DataSourceConfig dsc = new DataSourceConfig();           // 创建DataSourceConfig实例
//        dsc.setUrl("jdbc:postgresql://localhost:5432/postgres"); // 设置数据库连接URL为本地PostgreSQL
//        dsc.setDriverName("org.postgresql.Driver");              // 指定数据库驱动类名为PostgreSQL驱动
//        dsc.setUsername("postgres");                             // 设置数据库登录用户名为postgres
//        dsc.setPassword("6965433.");                             // 设置数据库登录密码
//        dsc.setDbType(DbType.POSTGRE_SQL);                       // 配置数据库类型为POSTGRE_SQL
//        mpg.setDataSource(dsc);
//
//        /******************** 包配置 ********************/
//        PackageConfig pc = new PackageConfig(); // 初始化包配置对象
//        pc.setParent("com.lrabbit");            // 设置父包名，用于定义代码生成的顶级包路径，便于代码组织和管理
//        pc.setEntity("entity");                 // 设置实体类包名，实体类通常用于封装数据库中的表数据
//        pc.setMapper("mapper");                 // 设置Mapper接口包名，Mapper接口用于定义数据库操作方法
//        pc.setService("service");               // 设置Service接口包名，Service接口封装业务逻辑
//        pc.setServiceImpl("service.impl");      // 设置Service实现类包名，实现具体的业务逻辑
//        pc.setController("controller");         // 设置Controller类包名，Controller处理HTTP请求并调用Service层
//        mpg.setPackageInfo(pc);
//
//        /***************** 策略配置 *****************/
//        StrategyConfig strategy = new StrategyConfig();// 创建StrategyConfig实例，用于配置生成代码的策略
//        strategy.setInclude("tb_sys_user");// 指定需要生成的表名
//        strategy.setTablePrefix("tb_"); // 配置表名前缀，方便去除前缀生成更符合Java规范的类名
//        strategy.setNaming(NamingStrategy.underline_to_camel); // 命名策略：将数据库表的下划线分隔转为驼峰命名法
//        strategy.setColumnNaming(NamingStrategy.underline_to_camel); // 列名命名策略同样采用下划线转驼峰命名
//        strategy.setEntityLombokModel(true); // 启用Lombok，自动生成getter/setter等方法，简化代码
//        strategy.setRestControllerStyle(true);// 控制器层使用@RestController风格，适合RESTful API开发
//        strategy.setControllerMappingHyphenStyle(true);// URL中使用连字符(-)代替驼峰作为分隔，以适应不同的URL风格
//        strategy.setEntityTableFieldAnnotationEnable(true);// 在实体类的属性上添加表字段相关注解，如@Column等
//        mpg.setStrategy(strategy);
//
//        /******************** 模板配置 ********************/
//        TemplateConfig templateConfig = new TemplateConfig();
//        templateConfig.setXml("/templates/mapper.xml.vm");
//        templateConfig.setService("");
//        mpg.setTemplate(templateConfig);
//
//        /******************** 自定义配置 ********************/
//        gc.setEntityName("%sDO");               // 设置实体类的名称模板
//        gc.setXmlName("%sDOMapper");            // 设置与实体类对应的XML映射文件名称模板
//        gc.setMapperName("%sDOMapper");         // 设置Mapper接口的名称模板
//        gc.setServiceName("%sService");         // 设置服务接口的名称模板
//        gc.setServiceImplName("%sServiceImpl"); // 设置服务接口的实现类的名称模板
//        gc.setControllerName("%sController");   // 设置控制器类的名称模板
//        mpg.setGlobalConfig(gc);
//
//        mpg.execute();
    }
}
